#include <ostream>
#include <string>


class Screen {
    friend class Window_mgr;
    // friend void Window_mgr::clear(ScreenIndex);
public:
    typedef std::string::size_type pos; // 定义一个类型成员
    Screen() = default;     // 使用默认构造函数
    Screen(pos ht, pos wd, char c):
        height(ht),
        width(wd),
        contents(ht*wd, c) {}
    
    // 获取光标处的字符
    char get() const {                     // 隐式内联
        return contents[cursor];
    }
    inline char get(pos ht, pos wd) const; // 显示内联
    Screen& move(pos r, pos c);            // 可在之后设为内联
    void some_member() const;
    Screen& set(char);
    Screen& set(pos, pos, char);
    Screen& display(std::ostream &os) {
        do_display(os);
        return *this;
    }
    const Screen& display(std::ostream &os) const {
        do_display(os);
        return *this;
    }
private:
    void do_display(std::ostream &os) const {
        os << contents;
    }
    mutable size_t access_ctr;  // 即使在一个 const 对象内也能被修改

    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
};

// inline 函数需要与类的定义在一个头文件中
// 在函数定义时，指定 inline
inline Screen& Screen::move(pos r, pos c) {
    pos row = r * width;    // 计算行
    cursor = row + c;
    return *this;
}

// 在内的内部已经声明为 inline 了
char Screen::get(pos r, pos c) const {
    pos row = r * width;    // 计算行
    return contents[row+c];
}